iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 17
0

前言

連假邁入第二天,想必大家的中秋夜晚一定很精彩吧!雖然可能隔天還要上班,或是跟筆者一樣坐在電腦前,但願各位都能擁有美好的回憶。回到正題,昨天在提到了 launch 的架構還有怎麼創建後,今天就來說說怎麼去讀懂一個完整的 launch 檔,還有要怎麼把想要結合的模塊去做匯整,幫助大家在初學階段時整合一個屬於自己的 launch 啦!那就開始今天的介紹吧!

launch 內容

今天我們就要來分析下 launch 中的內容來跟大家做個介紹,雖然我已經說過它是由Xml的格式製作而成,但對於標籤之內的細節,還是要有基本的了解。

1.標籤

<launch>
    ......
<launch/>

通常我們可以看到 launch 檔內會出現 <tabname> <tabname/>,此稱之為標籤,通常內容就是我們要開啟的目標。而 launch 檔的所有內容,都必須被 <launch> <launch/> 包含在內,否則它就是一個普通的文字檔。

2.參數

這邊舉幾個比較常見的參數:

  1. pkg:欲開啟節點所在的 package名稱。
  2. type:最初節點的名稱或資料的類型。
  3. name:可自行再賦予節點的新名稱,簡單來說就是複寫了 type ,使用 rqt 或者 rosnode list, rosnode info可查看。
  4. respawn/require:前著為避免遇到不明狀況導致開啟失敗時,可自行重新開啟節點。後著為遇到問題時關閉整launch檔。
  5. ns:如有設定 workspace,則在那個 workspace 中執行;當你必須在多個子類別,instance 中執行同一個節點將會有幫助。
  6. remap:這是一個標籤但是很有用處,所以在這介紹 主要是將你監聽的 topic,切換至另一個 Node 所發出的 topic。
  7. param:使用此型式的參數會回傳到系統的伺服器中,任何節點都可以得到這宣告的參數。
  8. arg:只在自己的節點內才可讀取的參數。

3. 判別式

在 launch 內也可以對節點進行設置開啟的時機或者跳過那些節點:

首先節點必須先設置如下:

<arg name="load_driver" default="true"/>

如此當你想要打開這個節點所在的launch又不想啟動它時,可以於終端輸入以下程式碼:

roslaunch pkg node load_driver:=false

如此一來就不會執行它了

4. 好用的小技巧

前面提過,launch 只能從自己的 Package 中提取資料跟 Node,那如果想把兩個 launch 結合起來呢?是不是要把兩個 Package 融合?這邊就要教大家一個小工具啦!

你只需要開啟一個新 package,在 launch 內使用內使用 <include> 這個標籤就可以啦。那要怎麼使用呢?必須在 launch 檔中添加以下程式碼:

<include file="$(find packagename)/launch/yourname.launch">

首先我們來看看它的構成

file="$(find robotcontrol)/launch/test.launch"

這一串都是在說明檔案的位置。我推薦照著上面的步驟寫,後面說明原因

其中所標示的是你想要加入的 launch 所在的所在的 Package 名稱,後面就是檔案所在的路徑位置。那這樣寫的好處是,我們是藉由 Package 來去尋找目標,假設你今天換了電腦後存放路徑變不一樣,只要 Package 存在電腦內就能夠順利地開啟。

接下來分析兩個 launch 來作說明幫助理解:

    1. gmapping.launch (啟動機器人進行 slam 地圖掃描建構)

https://ithelp.ithome.com.tw/upload/images/20200929/20129808ypExmnapav.jpg

首先看到
<arg name="..........." default="........" doc="modle type[....]"/> 當中 arg, name 前面有提過了,來說說 default 跟 doc:

可以看到 default 後面的資料 $(env ...),代表說預設的環境參數,env 為環境的縮寫,而後面的 doc 則為資料的型態,如同下面 <praram> 裡的 value 是同個意思,這邊提到一下筆者蒐集的資料中,有人說明使用 doc 是因為 <arg> 中不能使用 value,有興趣可以回去試一下,因為通常我們會改動的只有 model type 後方的機器人名稱而已。

再來看到下方 <!--gmapping--> 裡開啟節點的部分 <node...>,最後有個 output,這個指令的意思是輸出 log 的目標(screen : console, log: log file)

接著下面就是針對不同的環境參數進行命名,給定預設數值的部分,這邊就不作介紹了,相信大家都已經看懂了。

    1. emptyworld.launch (打開 gazebo 導入空白世界和機器人)

https://ithelp.ithome.com.tw/upload/images/20200929/20129808IwRsCM8RjY.jpg

這裡我們直接看到中間 <include>,就像我們上面所講的,這邊就是在將不同的 launch 來做結合。中間都是在給定這個導入的 launch 我們想要的參數。至於最後下面的 <param> 是在說明機器人的描述檔,有興趣的可以在電腦中打開來欣賞一下,這個檔案試在你建模匯出時系統自動生成的,所以不要想說要自己寫出一台機器人,太嚇人了!

最後只要你對於自己所需要的 Node ,還有 launch 去做個統整後,依照上面所提供的工具,只需要打下面的指令在終端機,就能夠順利執行啦,這樣就算是了解launch的基礎了喔!

roslaunch [yourname_package] your.launch

想要更多請點

結語

對於 launch 的介紹就算告個段落啦,但是這些只是很基本的東西,如果想要學習得更快更精深,最好的方法就是觀察那些別人已經完成而且運作順暢的檔案,然後一步步的了解裡面的內容,相信對於學習的進步會有相當顯著的效果。明天開始我們則會介紹 gazebo 中記錄世界參數的 world 檔啦!請大家敬請期待!!
https://ithelp.ithome.com.tw/upload/images/20201002/20129807NBhnODQPbs.png


上一篇
[DAY 16]ROS Launch 的介紹與應用1
下一篇
[DAY 18] World 檔的介紹及應用
系列文
ROS系統控制自走車搭配點雲雷達(隧道檢測裝置)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言